package NIO;

//https://blog.csdn.net/weixin_43815050/article/details/95218893  别人的博客
        /*一、缓冲区(Buffer) :在Java NIO中负责数据的存取。缓冲区就是数组。用于存储不同数据类型的数据
        根据数据类型不同(boolean除外)，提供了相应类型的缓冲区:
        ByteBuffer
        CharBuffer
        ShortBuffer
        IntBuffer
        LongBuffer
        FloatBuffer
        DoubleBuffer
        上述缓冲区的管理方式几乎-致,通过allocate()获取缓冲区*/


        /*二、缓冲区存取数据的两个核心方法:
        put() : 存入数据到缓冲区中
        get() :获取缓冲区中的数据
        四、缓冲区中的四个核心属性:
        capacity :容量，表示缓冲区中最大存储数据的容量。-旦声明不能改变。
        limit :界限，表示缓冲区中可以操作数据的大小。(limit 后数据不能进行读
        position:位置,表示缓冲区中正在操作数据的位置。
        position <= limit <= capacity*/
//        五、直接缓冲区与非直接缓冲区:
//        非直接缓冲区:通过allocate()方法分配缓冲区, 将缓冲区建立在JVM的内存中
//        直接缓冲区:通过allocateDirect()方法分配直接缓冲区，将缓冲区建立在物理内存中。可以提高效率
//        但是放到操作系统内存我们就没法管了会占用资源等  isDirect可以判断是否是直接缓冲区


import java.nio.ByteBuffer;

public class TestBuffer1 {
    public static void main(String[] args) {
        //分配指定缓冲区的大小
        ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
        System.out.println("--------------allocate()----------------");
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());




        //put将数据写入缓冲区
        String str="abcde";
        byteBuffer.put(str.getBytes());
        System.out.println("--------------put()----------------");
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());


        //切换读写模式  flip()
        byteBuffer.flip();
        System.out.println("--------------flip()----------------");
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());


        //利用get读取缓冲区的数据

        byte[] bytes=new byte[byteBuffer.limit()];
        System.out.println("--------------get()----------------");
        byteBuffer.get(bytes);
        System.out.println(new String(bytes,0,bytes.length));
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());


        //rewind() 可以重复读
        byteBuffer.rewind();
        System.out.println("--------------rewind()----------------");
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());



        //clear() 清空缓冲区。但是缓冲区中的数据依然存在，但是处王“被遗忘”状态 指针回到最初状态
        byteBuffer.clear();
        System.out.println("--------------clear()----------------");
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());
        System.out.println((char) byteBuffer.get());



    }
}
